import axios, { AxiosRequestConfig } from 'axios';
import axiosRetry from 'axios-retry';

axiosRetry(axios, {retries: 3})

// 取对应环境变脸的url
export const baseUrl: string = import.meta.env.VITE_BASE_API;

// 在正式的项目中，如果后端有有约定统一的code，比如登录code为1000，权限code为1001等等，那么这里可以针对这些code进行统一的封装，这样，所有的接口都会统一走这个逻辑
// 这里先声明了一个枚举类型，方便统一管理特殊的code，然后定义一个接口类型，最后在http方法里通过switch case的方式，去对不同的code进行特殊的逻辑处理
enum ResCode {
  notLogin = 1001,
  notPower = 1002,
  // ...其他状态码
}

// 定义一个接口类型
export interface IResponse< T = any> {
  code?: number;
  data?: T;
  msg: string;
  // [key: string]: any;
} 


// 创建一个axios实例
const instance = axios.create({
  // baseURL: 'http://api.example.com', // 你的 API 地址
  baseUrl,
  timeout: 10000,
  withCredentials: true, // 浏览器石佛应该发送凭证（如 cookies 、授权头等）到跨域请求的服务器
  //   headers: {
  //     'Content-Type': 'application/json', // 设置请求头，根据实际情况修改
  //   }
});

// interface IConfig {
//   [key: string]: any;
// }



// 请求拦截
instance.interceptors.request.use((config: any) => {

  const token = getToken(); // 自定义获取token
  if (config?.headers && token) {
    config.headers["Authorization"] = token || "";
  }


  return config;
}, (error: Error) => {
  return Promise.reject(error)
});



// 响应拦截
instance.interceptors.response.use((response: IResponse) => {
  return response.data;
}, (error: Error) => {
  return Promise.reject(error)
});


// 自定义配置
interface IAxiosParam extends AxiosRequestConfig<any> {
  /**
   * 接口是否需要完整的res，默认不需要，直接返回res.data
   */
  needRes?: boolean;

  /**
   * 接口异常时进行统一拦截提示
   */
  noAlert?: boolean;
}

// 将风发封装成一个函数
const http = async (config: IAxiosParam): Promise<any> => {
  return instance(config).then((res: IResponse) => {
    switch (res.code) {
      case ResCode.notLogin:
        // 未登录
        // window.location.href = '/login';
        break;
      case ResCode.notPower:
        // 无权限
        // window.location.href = '/403';
        break;
    }

    if (res.code !== 0 && !config.noAlert) {
      

    }
    return res;
  }).catch((err: Error) => {
    return Promise.reject(err)
  })
}

export default http;